#-*- codeing = utf-8 -*-
#@Time : 2020/11/30 15:55
#@Author : 阳某
#@File : test2.py
#@Software : PyCharm

# XML 格式消息体
# 前面说了，消息体就是存放信息的地方，信息的格式完全取决设计者的需要。
# 如果设计者决定用 XML 格式传输一段信息，用Requests库，只需要这样
payload = '''
<?xml version="1.0" encoding="UTF-8"?>
<WorkReport>
    <Overall>良好</Overall>
    <Progress>30%</Progress>
    <Problems>暂无</Problems>
</WorkReport>
'''
r = requests.post("http://httpbin.org/post",
                  data=payload.encode('utf8'))
print(r.text)

'''

Requests库的post方法，参数data指明了，消息体中的数据是什么。

如果传入的是字符串类型，Requests 会使用缺省编码 latin-1 编码为字节串放到http消息体中，发送出去。

而上面的例子里面包含中文，不能用缺省 latin-1编码.

所以我们将字符串对象，用 utf8 编码为字节串对象Bytes 传入给data参数，Requests就会直接把这个字符串放到 http消息体中，发送出去。


如果作为系统开发的设计者，觉得发送这样一篇报告，只需要核心信息就可以了，不需要这样麻烦的XML格式，也可以直接用纯文本，像这样

payload = '''
#  report
#  Overall：良好
#  Progress: 30%
#  Problems：暂无
'''
r = requests.post("http://httpbin.org/post", 
                  data=payload.encode('utf8'))
print(r.text)
所以，如果就是一些字符信息，我们可以自行构建任何消息体格式。

但是采用 xml、json 这样的标准格式，可以很好的表示复杂的信息数据，

比如，我们要传递的工作报告里面，存在的问题有 多个，用 XML 就可以这样表示

<?xml version="1.0" encoding="UTF-8"?>
<WorkReport>
    <Overall>良好</Overall>
    <Progress>30%</Progress>
    <Problems>
       <problem  no='1'>
        <desc>问题1....</desc>
       </problem>
       <problem  no='2'>
        <desc>问题2....</desc>
       </problem>
    
    </Problems>
</WorkReport>'''



'''
urlencoded 格式消息体

点击这里，边看视频讲解，边学习以下内容

这种格式的消息体就是一种 键值对的格式存放数据，如下所示

key1=value1&key2=value2
Requests发送这样的数据，当然可以直接把这种格式的字符串传入到data参数里面。

但是，这样写的话，如果参数中本身就有特殊字符，比如等号，就会被看成参数的分隔符，就麻烦了。

我们还有更方便的方法：只需要将这些键值对的数据填入一个字典。

然后使用post方法的时候，指定参数 data 的值为这个字典就可以了，如下

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
如果我们用工具抓包就可以发现 发送的http请求如下

白月黑羽Python3教程

json 格式消息体

点击这里，边看视频讲解，边学习以下内容

json 格式 当前被 Web API 接口广泛采用。

json 是一种表示数据的语法格式。 它和Python 表示数据的语法非常像。

比如要表示上面的报告信息，可以这样

{
    "Overall":"良好",
    "Progress":"30%",
    "Problems":[
        {
            "No" : 1,
            "desc": "问题1...."
        },
        {
            "No" : 2,
            "desc": "问题2...."
        }
    ]
}
它的优点是：比xml更加简洁、清晰， 所以程序处理起来效率也更高。


我们怎样才能构建一个json 格式的字符串呢？

可以使用json库的dumps方法，如下

import requests,json

payload = {
    "Overall":"良好",
    "Progress":"30%",
    "Problems":[
        {
            "No" : 1,
            "desc": "问题1...."
        },
        {
            "No" : 2,
            "desc": "问题2...."
        },
    ]
}

r = requests.post("http://httpbin.org/post", data=json.dumps(payload))
也可以将 数据对象 直接 传递给post方法的 json参数，如下

r = requests.post("http://httpbin.org/post", json=payload)
'''